package Day_0131.JVM;

/**
 * @author zxc
 * @date 2023/01/31 15:56
 **/
public class ArrayList_LinkedList {
    public static void main(String[] args) {
        /**
         * 1.ArrayList（类似于Array的特点）
         * （1）优点：（查询效率高）
         *  ArrayList 是实现了基于动态数组的数据结构，因为地址连续，一旦数据存储好了，查询操作效率会比较高（在内存里是连着放的）。
         * （2）缺点：（新增和删除操作效率低）
         *  因为地址连续，ArrayList 要移动数据，所以插入和删除操作效率比较低。
         *
         * 2.LinkedList（类似于 链表的特点;）
         * （1）优点：
         *  LinkedList 基于链表的数据结构，地址是任意的，所以在开辟内存空间的时候不需要等一个连续的地址。
         *  对于新增和删除操作，LinkedList 比较占优势。
         *  LinkedList 适用于要头尾操作或插入指定位置的场景。
         * （2）缺点：
         *  因为 LinkedList 要移动指针，所以查询操作性能比较低。
         *
         * 3.适用场景分析
         * （1）当需要对数据进行对随机访问的时候，选用 ArrayList。
         *  注意 ：如果容量固定，并且只会添加到尾部，不会引起扩容，优先采用 ArrayList。
         * （2）当需要对数据进行多次增加删除修改时，采用 LinkedList。
         * ===》 绝大数业务的场景下，使用 ArrayList 就够了，但需要注意避免 ArrayList 的扩容，以及非顺序的插入。
         */

        /**
         * 浅谈一下ArrayList的特点。
         *
         * 1.概念
         * ArrayList ：是Java 集合框架中的一种存放相同类型的元素数据，是一种变长的集合类，基于定长数组实现;
         * 当加入数据达到一定程度后，会实行自动扩容，即扩大数组大小。
         *
         * 2.底层实现 ：底层是使用数组实现，添加元素。
         *
         * 3.add方法（添加元素）
         * （1）如果 add(o)，添加到的是数组的尾部，
         * 如果要增加的数据量很大，应该使用 ensureCapacity()方法，该方法的作用是预先设置 ArrayList 的大小，这样可以大大提高初始化速度。
         * （2）如果使用 add(int,o)，添加到某个位置，那么可能会挪动大量的数组元素，并且可能会触发扩容机制。
         *
         * 4.高并发情况
         * 高并发的情况下，线程不安全。多个线程同时操作 ArrayList，会引发不可预知的异常或错误。
         *
         * 5.ArrayList 实现了 Cloneable 接口，标识着它可以被复制。
         * 注意：ArrayList 里面的 clone() 复制其实是浅复制。
         */

        /**
         * 由于已经存在Array，那为啥还需要ArrayList？
         * 在不明确要插入多少数据的情况下，普通数组Array就很尴尬了，因为你不知道需要初始化数组大小为多少，
         * 而 ArrayList 可以使用默认的大小，当元素个数到达一定程度后，会自动扩容。
         *
         * 可以这么来理解：我们常说的数组是定死的数组，ArrayList 却是动态数组。
         * ===》 即，Array为固定大小数组;同时，ArrayList为动态数组（即，当数组元素到达一定数量时，会进行自动扩容）;
         */
    }
}
